﻿using Circus.Utility;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using System.Web.WebPages;

namespace WoAiPao {

    /// <summary>
    /// 表示 FIO 所有 Razor 页面的基类。
    /// </summary>
    public abstract class WebPageBase : WebPage {

        /// <summary>
        /// 获取提交的绑定数据。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T getQuery<T>()
            where T : new() {
            var result = new T();
            UIBinder.loadData(result, Request.QueryString);
            return result;
        }

        /// <summary>
        /// 获取页面请求参数并转为整数类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public int getQueryInt(string paramName, int defaultValue = 0) {
            return ConvertHelper.parseInt(Request.QueryString[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面请求参数并转为整数类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public long getQueryLong(string paramName, long defaultValue = 0) {
            return ConvertHelper.parseLong(Request.QueryString[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面请求参数并转为布尔类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public bool getQueryBool(string paramName, bool defaultValue = false) {
            return ConvertHelper.parseBool(Request.QueryString[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面请求参数并转为时间类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <returns>返回参数。</returns>
        public DateTime getQueryDateTime(string paramName) {
            return ConvertHelper.parseDateTime(Request.QueryString[paramName]);
        }

        /// <summary>
        /// 获取页面请求参数并转为时间类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public DateTime getQueryDateTime(string paramName, DateTime defaultValue) {
            return ConvertHelper.parseDateTime(Request.QueryString[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面请求参数并转为字符串类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public string getQueryString(string paramName, string defaultValue = null) {
            return Request.QueryString[paramName] ?? defaultValue;
        }

        /// <summary>
        /// 获取提交的绑定数据。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T getForm<T>()
            where T : new() {
            var result = new T();
            UIBinder.loadData(result, Request.Form);
            return result;
        }

        /// <summary>
        /// 获取页面提交参数并转为整数类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public int getFormInt(string paramName, int defaultValue = 0) {
            return ConvertHelper.parseInt(Request.Form[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面提交参数并转为整数类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public long getFormLong(string paramName, long defaultValue = 0) {
            return ConvertHelper.parseLong(Request.Form[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面提交参数并转为布尔类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public bool getFormBool(string paramName) {
            return ConvertHelper.parseBool(Request.Form[paramName]);
        }

        /// <summary>
        /// 获取页面提交参数并转为时间类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <returns>返回参数。</returns>
        public DateTime getFormDateTime(string paramName) {
            return ConvertHelper.parseDateTime(Request.Form[paramName]);
        }

        /// <summary>
        /// 获取页面提交参数并转为时间类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public DateTime getFormDateTime(string paramName, DateTime defaultValue) {
            return ConvertHelper.parseDateTime(Request.Form[paramName], defaultValue);
        }

        /// <summary>
        /// 获取页面提交参数并转为字符串类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public string getFormString(string paramName, string defaultValue = null) {
            return Request.Form[paramName] ?? defaultValue;
        }

        /// <summary>
        /// 获取页面提交参数并转为字符串类型。
        /// </summary>
        /// <param name="paramName">要获取的参数名。</param>
        /// <param name="defaultValue">如果不存在此参数所返回的参数默认值。</param>
        /// <returns>返回参数。</returns>
        public string getForm(string paramName, string defaultValue = null) {
            return Request.Form[paramName] ?? defaultValue;
        }

    }

    /// <summary>
    /// 提供页面常用样式的辅助函数。
    /// </summary>
    public static class HtmlHelperExtesnions {

        /// <summary>
        /// 错误提示。
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public static System.Web.HtmlString errorTip(this System.Web.WebPages.Html.HtmlHelper html, string message) {
            if (String.IsNullOrEmpty(message)) {
                return new System.Web.HtmlString(String.Empty);
            }
            return new System.Web.HtmlString("<div class=\"am-alert am-alert-danger\">" + message + "</div>");
        }

        /// <summary>
        /// 错误提示。
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public static System.Web.HtmlString warningTip(this System.Web.WebPages.Html.HtmlHelper html, string message) {
            if (String.IsNullOrEmpty(message)) {
                return new System.Web.HtmlString(String.Empty);
            }
            return new System.Web.HtmlString("<div class=\"am-alert am-alert-warning\">" + message + "</div>");
        }

        /// <summary>
        /// 生成分页组件。
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static System.Web.HtmlString pager(this System.Web.WebPages.Html.HtmlHelper html, int totalCount, int pageSize, int pageNumber, int navCount = 7, string liActivedClassName = "actived", string queryName = "page", string ulAttributes = null, string liAttributes = null) {
            var pageCount = (totalCount - 1) / pageSize + 1;
            if (pageCount <= 1) {
                return new System.Web.HtmlString(String.Empty);
            }

            var sideCount = (navCount - 1) / 2;

            var startPage = pageNumber - sideCount;
            var endPage = pageNumber + sideCount;

            // 确保最小从第 1 页开始。
            if (startPage <= 0) {
                endPage += 1 - startPage;
                startPage = 1;
            }

            // 确保最大到最后 1 页结束。
            if (endPage >= pageCount) {
                startPage -= endPage - pageCount;
                endPage = pageCount;
            }

            // 确保最小从第 1 页开始。
            if (startPage <= 0) {
                startPage = 1;
            }

            StringBuilder sb = new StringBuilder();
            sb.Append("<ul ").Append(ulAttributes).Append(">");

            // 添加上一页。
            if (pageNumber > 1) {
                sb.Append("<li ").Append(liAttributes).Append("><a href=\"")
                    .Append(HttpContext.Current.Request.Url.appendQueryStringParameter(queryName, (pageNumber - 1).ToString()).Query)
                    .Append("\">&laquo;</a></li>");
            }

            // 添加页码。
            for (var p = startPage; p <= endPage; p++) {

                sb.Append("<li ");
                if (p == pageNumber) {
                    sb.Append("class=\"").Append(liActivedClassName).Append("\" ");
                }
                sb.Append(liAttributes).Append("><a href=\"")
                    .Append(HttpContext.Current.Request.Url.appendQueryStringParameter(queryName, p.ToString()).Query)
                    .Append("\">")
                    .Append(p)
                    .Append("</a></li>");

            }

            // 添加下一页。
            if (pageNumber < pageCount) {
                sb.Append("<li ").Append(liAttributes).Append("><a href=\"")
                    .Append(HttpContext.Current.Request.Url.appendQueryStringParameter(queryName, (pageNumber + 1).ToString()).Query)
                    .Append("\">&raquo;</a></li>");
            }

            sb.Append("</ul>");
            return new System.Web.HtmlString(sb.ToString());
        }

    }

}